home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / misc / interfaces3_5.lha / Interfaces / RealTime.mod < prev    next >
Text File  |  1994-11-06  |  9KB  |  237 lines

  1. (*
  2. (*  Amiga Oberon Interface Module:
  3. **  $VER: RealTime.mod 40.15 (6.11.94) Oberon 3.5
  4. **
  5. **      (C) Copyright 1993 Commodore-Amiga Inc.
  6. **      All Rights Reserved
  7. **
  8. **      (C) Copyright Oberon Interface 1993, 1994 by hartmut Goebel
  9. *)      All Rights Reserved
  10. *)
  11.  
  12. MODULE RealTime;
  13.  
  14. IMPORT
  15.   e * := Exec,
  16.   u * := Utility;
  17.  
  18. TYPE
  19.   ConductorPtr     * = UNTRACED POINTER TO Conductor;
  20.   PlayerPtr        * = UNTRACED POINTER TO Player;
  21.   MsgPtr           * = UNTRACED POINTER TO Msg;
  22.     PMTimePtr      * = UNTRACED POINTER TO PMTime;
  23.     PMStatePtr     * = UNTRACED POINTER TO PMState;
  24.   RealTimeBasePtr  * = UNTRACED POINTER TO RealTimeBase;
  25.  
  26. (*****************************************************************************)
  27. CONST
  28.  
  29. (* realtime.library's idea of time is based on a clock which emits a pulse
  30.  * 1200 times a second (1.2kHz). All time values maintained by realtime.library
  31.  * are based on this number. For example, the field RealTimeBase->rtb_Time
  32.  * expresses an amount of time equivalent to (RealTimeBase->rtb_Time/TICK_FREQ)
  33.  * seconds.
  34.  *)
  35.   tickFreq            * = 1200;
  36.  
  37.  
  38. (*****************************************************************************)
  39. TYPE
  40.  
  41. (* Each Conductor represents a group of applications which wish to remain
  42.  * synchronized together.
  43.  *
  44.  * This structure must only be allocated by realtime.library and is
  45.  * READ-ONLY!
  46.  *)
  47.   Conductor * = STRUCT (link - : e.Node)
  48.     reserved0       - : INTEGER;
  49.     players         - : e.MinList;     (* this conductor's players      *)
  50.     clockTime       - : LONGINT;       (* current time of this sequence *)
  51.     startTime       - : LONGINT;       (* start time of this sequence   *)
  52.     externalTime    - : LONGINT;       (* time from external unit       *)
  53.     maxExternalTime - : LONGINT;       (* upper limit on sync'd time    *)
  54.     metronome       - : LONGINT;       (* MetricTime highest pri node   *)
  55.     reserved1       - : INTEGER;
  56.     flags           - : SET;           (* conductor flags               *)
  57.     state           - : SHORTINT;      (* playing or stopped            *)
  58.   END;
  59.  
  60. CONST
  61. (* Flag bits for Conductor.cdt_Flags *)
  62.  
  63.   external    * = 0;   (* clock is externally driven *)
  64.   gotTick     * = 1;   (* received 1st external tick *)
  65.   metroSet    * = 2;   (* cdt_Metronome filled in    *)
  66.   private     * = 3;   (* conductor is private       *)
  67.  
  68. (* constants for Conductor.cdt_State and SetConductorState() *)
  69.   stopped    * = 0;   (* clock is stopped              *)
  70.   paused     * = 1;   (* clock is paused               *)
  71.   locate     * = 2;   (* go to 'running' when ready    *)
  72.   running    * = 3;   (* run clock NOW                 *)
  73.  
  74. (* These do not actually exist as Conductor states, but are used as additional
  75.  * arguments to SetConductorState()
  76.  *)
  77.   metric     * = -1;   (* ask high node to locate       *)
  78.   shuttle    * = -2;   (* time changing but not running *)
  79.   locateSet  * = -3;   (* maestro done locating         *)
  80.  
  81.  
  82. (*****************************************************************************)
  83. TYPE
  84.  
  85. (* The Player is the connection between a Conductor and an application.
  86.  *
  87.  * This structure must only be allocated by realtime.library and is
  88.  * READ-ONLY!
  89.  *)
  90.   Player * = STRUCT (link - : e.Node)
  91.     reserved0    - : SHORTINT;
  92.     reserved1    - : SHORTINT;
  93.     hook         - : u.HookPtr;        (* player's hook function       *)
  94.     source       - : ConductorPtr;     (* pointer to parent context    *)
  95.     task         - : e.TaskPtr;        (* task to signal for alarm     *)
  96.     metricTime   - : LONGINT;          (* current time in app's metric *)
  97.     alarmTime    - : LONGINT;          (* time to wake up              *)
  98.     userData     - : e.APTR;           (* for application use          *)
  99.     playerID     - : INTEGER;          (* for application use          *)
  100.     flags        - : INTEGER;          (* general Player flags         *)
  101.   END;
  102.  
  103. CONST
  104. (* Flag bits for Player.pl_Flags *)
  105.  
  106.   ready        * = 0;      (* player is ready to go!        *)
  107.   alarmSet     * = 1;      (* alarm is set                  *)
  108.   quiet        * = 2;      (* a dummy player, used for sync *)
  109.   conducted    * = 3;      (* give me metered time          *)
  110.   extsync      * = 4;      (* granted external sync         *)
  111.  
  112.  
  113. (*****************************************************************************)
  114.  
  115.  
  116. (* Tags for CreatePlayer(), SetPlayerAttrs(), and GetPlayerAttrs() *)
  117.   playerBase          * = u.user+64;
  118.   playerHook          * = playerBase+1;   (* set address of hook function *)
  119.   playerName          * = playerBase+2;   (* name of player               *)
  120.   playerPriority      * = playerBase+3;   (* priority of player           *)
  121.   playerConductor     * = playerBase+4;   (* set conductor for player     *)
  122.   playerReady         * = playerBase+5;   (* the "ready" flag             *)
  123.   playerAlarmTime     * = playerBase+12;  (* alarm time (sets PLAYERF_ALARMSET) *)
  124.   playerAlarm         * = playerBase+13;  (* sets/clears PLAYERF_ALARMSET flag  *)
  125.   playerAlarmSigTask  * = playerBase+6;   (* task to signal for alarm/notify    *)
  126.   playerAlarmSigBit   * = playerBase+8;   (* signal bit for alarm (or -1)       *)
  127.   playerConducted     * = playerBase+7;   (* sets/clears PLAYERF_CONDUCTED flag *)
  128.   playerQuiet         * = playerBase+9;   (* don't process time thru this       *)
  129.   playerUserData      * = playerBase+10;
  130.   playerID            * = playerBase+11;
  131.   playerExtSync       * = playerBase+14;  (* attempt/release to ext sync  *)
  132.   playerErrorCode     * = playerBase+15;  (* error return value           *)
  133.  
  134.  
  135. (*****************************************************************************)
  136.  
  137.  
  138. (* Method types for messages sent via a Player's hook *)
  139.   pmTick              * = 0;
  140.   pmState             * = 1;
  141.   pmPosition          * = 2;
  142.   pmShuttle           * = 3;
  143.  
  144. TYPE
  145.   Msg * = STRUCT END;  (* dummy base for all message type *)
  146.  
  147. (* used for PM_TICK, PM_POSITION and PM_SHUTTLE methods *)
  148.   PMTime * = STRUCT (msg * : Msg)
  149.     method       * : LONGINT;        (* PM_TICK, PM_POSITION, or PM_SHUTTLE *)
  150.     time         * : LONGINT;
  151.   END;
  152.  
  153. (* used for the PM_STATE method *)
  154.   PMState * = STRUCT (msg * : Msg)
  155.     method       * : LONGINT;        (* PM_STATE *)
  156.     oldState     * : LONGINT;
  157.   END;
  158.  
  159.  
  160. (*****************************************************************************)
  161. CONST
  162.  
  163. (* Possible lock types for LockRealTime() *)
  164.   conductors     * = 0;   (* conductor list *)
  165.  
  166.  
  167. (*****************************************************************************)
  168.  
  169.  
  170. (* realtime.library error codes *)
  171.   noMemory         * = 801;   (* memory allocation failed      *)
  172.   noConductor      * = 802;   (* player needs a conductor      *)
  173.   noTimer          * = 803;   (* timer (CIA) allocation failed *)
  174.   playing          * = 804;   (* can't shuttle while playing   *)
  175.  
  176.  
  177. (*****************************************************************************)
  178. TYPE
  179.  
  180. (* OpenLibrary("realtime.library",0) returns a pointer to this structure.
  181.  * All fields are READ-ONLY.
  182.  *)
  183.   RealTimeBase * = STRUCT (LibNode - : e.Library)
  184.     reserved0    - : ARRAY 2 OF SHORTINT;
  185.  
  186.     time         - : LONGINT;          (* current time                         *)
  187.     timeFrac     - : LONGINT;          (* fixed-point fraction part of time    *)
  188.     reserved1    - : INTEGER;
  189.     tickErr      - : INTEGER;          (* nanosecond error from ideal Tick     *)
  190.   END;                                 (* length to real tick length           *)
  191.  
  192. CONST
  193. (* Actual tick length is: 1/TICK_FREQ + rtb_TickErr/1e9 *)
  194.  
  195.   tickErrMin     * = -705;
  196.   tickErrMax     * =  705;
  197.  
  198. TYPE
  199.   RealTimeLock * = UNTRACED POINTER TO STRUCT END;
  200.  
  201. (*****************************************************************************)
  202.  
  203. VAR
  204.   base * : RealTimeBasePtr;
  205.  
  206. (*--- functions in V37 or higher (Release 2.04) ---*)
  207.  
  208. (* Locks *)
  209.  
  210. PROCEDURE LockRealTime   *{base,-01EH}(lockType{0}    : LONGINT): RealTimeLock;
  211. PROCEDURE UnlockRealTime *{base,-024H}(lock{8}        : RealTimeLock);
  212.  
  213. (* Conductor *)
  214.  
  215. PROCEDURE CreatePlayerA  *{base,-02AH}(tagList{8}     : ARRAY OF u.TagItem): PlayerPtr;
  216. PROCEDURE CreatePlayer   *{base,-02AH}(tag1{8}..      : u.Tag): PlayerPtr;
  217. PROCEDURE DeletePlayer   *{base,-030H}(player{8}      : PlayerPtr);
  218. PROCEDURE SetPlayerAttrsA*{base,-036H}(player{8}      : PlayerPtr;
  219.                                       tagList{9}      : ARRAY OF u.TagItem): BOOLEAN;
  220. PROCEDURE SetPlayerAttrs *{base,-036H}(player{8}      : PlayerPtr;
  221.                                       tag1{9}..       : u.Tag): BOOLEAN;
  222. PROCEDURE SetConductorState*{base,-03CH}(player{8}    : PlayerPtr;
  223.                                       state{0}        : LONGINT;
  224.                                       time{1}         : LONGINT ): LONGINT;
  225. PROCEDURE ExternalSync   *{base,-042H}(player{8}      : PlayerPtr;
  226.                                       minTime{0}      : LONGINT;
  227.                                       maxTime{1}      : LONGINT ): BOOLEAN;
  228. PROCEDURE NextConductor  *{base,-048H}(previousConductor{8}: ConductorPtr): ConductorPtr;
  229. PROCEDURE FindConductor  *{base,-04EH}(name{8}        : ARRAY OF CHAR): ConductorPtr;
  230. PROCEDURE GetPlayerAttrsA*{base,-054H}(player{8}      : PlayerPtr;
  231.                                       tagList{9}      : ARRAY OF u.TagItem): LONGINT;
  232. PROCEDURE GetPlayerAttrs *{base,-054H}(player{8}      : PlayerPtr;
  233.                                       tag1{9}..       : u.Tag): LONGINT;
  234.  
  235. END RealTime.
  236.  
  237.